/*
1 ItemHandle可以理解为是每对key-value的元数据，所以它是index模块中的value，根据key可以找到它对应的ItemHandle，从ItemHandle中可以获取value的地址
由于cache可以存储小的变长数据，因此可能多个key-value对存放在一个内存块中，即多个ItemHandle中的reclaim_handle/store_handle是相同的

2 StoreHandle是每个内存块的元数据，它由store模块产生，根据它可以得到它对应的内存指针，并且可以增加和减去这块内存的引用计数

3 RecaimHandle是reclaim模块的元数据，在reclaim模块中，用它来标记每个内存块，它由reclaim模块产生，当一个内存块被访问的时候要通知reclaim模块，某个ReclaimHandle对应的内存块被访问了

zyh: 了解了, 这三个现在完全明白鸟

4 set_store_level_type这个API的作用是神马?

zyh: 决定下层cache是否包含本级cache包含的数据. 试举一例: intel cpu 的l1, l2 cache之间就是包含关系, l1是l2的真子集. 但AMD的Athlon就不是, 当数据从
l2迁移到l1后, 会从l2中删除它. 这叫做牺牲者cache


5 key的hash和compare函数要以框架API的形式提供给index模块使用，所以index模块的put/get方法都是传入void* key，而不是计算好的hash值，这样以后index可以也使用树型结构

zyh: 了解

6 ItemHandle的内存分配不通过store模块，由框架自己管理

zyh: 是的, 恐怕得让外界传一个供内部分配元数据们使用的alloc()

7 刚才忽然想到ItemHandle中的key和value不能是指针类型，而应该是在内存块中的偏移，因为store要支持SSD存储

zyh: 要不就在不同场景下对uint64_t做不同的解释也可以. 在内存场景下就直接解释成指针.

8 还有一点刚想起来的修改reclaim模块的assign接口第三个参数不限定死了是uint64_t*，干脆也用void*，这样以后框架想修改就比较灵活了

9 对你写的示意put流程的修改：
*/
int CacheAPI.put(void *key, void *value, const int overwrite_key, const int overwrite_value)
{
	//int64_t hkey = 0;
	item_handle_t *ih = NULL;
	//store_handle sh;
	
	//ih = malloc(sizeof(item_handle_t)); // 这个应该不适用store接口吧?
  ih = slab_alloc_(sizeof(item_handle_t));

  if (!test_cur_store_valid_(cur_store_handle_, utils->sizeof_key(key), utils->sizeof_value(value)))
  {
    // 如果当前内存块满了或还没分配就分配一个
    cur_store_handle_ = store->alloc(MEMBLOCK_SIZE);
    void *store_handle_ptr = alloc_handle_memory_(cur_store_handle_); // 这里在内存块上为store_handle分配一块空间
    reclaim->assign(store_handle_ptr, &(ih->reclaim_handle));
    ih->store_handle = cur_store_handle_;
  }
  void *pkey = NULL;
  void *pvalue = NULL;
  copy_key_value_(cur_store_handle_, ih, &pkey, &pvalue);

zyh: 这个地方应该是
  copy_key_value_(store_handle_ptr, ih, key, value, &pkey, &pvalue);
     copy_key_value应该把(key, value)拷贝到store_handle_ptr指向的cur_store_handle内某区域上, cur_store_handle_里的东西是递增的,
	    而copy_key_value是由使用者提供的, 它得做一次顺序扫描才知道现在该拷到哪个位置上了. 所以我觉得
		   应该传入store_handle_ptr. 对吧?

然后
    ih->key = pkey;
     ih->value = pvalue;

     如果用偏移式记录kv, 就是
	     ih->key = (uint64_t)pkey - (uint64_t)cur_store_handle_;
             ih->value = (uint64_t)pvalue - (uint64_t)cur_store_handle_;


	//if (utils->copy_value) // 如果用户定义了copy_value表示他想深拷贝
	//{
	//	store_handle tmp;
	//	store->alloc(utils->sizeof_value(value), tmp);
	//	utils->copy_value(value, tmp);
	//	ih->value = tmp;
	//}
	//else
	//{
	//	ih->value = value;
	//}
	

	//ih->key = key;
	//if (utils->hash_key)
	//	hkey = utils->hask_key(key);
	//else
	//	hkey = default_hash_key(key);

	hash_index->put(pkey, ih); // 这里存疑，是应该传heky还是key?
	// hash_index->put 见后边
	return 0;
}
